/**
*	file Spell.h
*	\brief Module qui gere les Spell
*	\author Ostapenco Vladimir, Gehin Maxime
*	\version 1.0
*	\date 16/12/2013
*	Le module initialise et libere les spell.
*/

#ifndef SPELL_H
#define SPELL_H

/**
* \struct Spell
* \brief Un spell contient un nom, un id, un schooldamage(physic ou magic),une portée, un rayon, un booleen needtarget (certains spell ont besoin d'une cible pour etre lancé, d'autre non),un levelmin (level a partir duquel le spell sera disponible au joueur et une base de degat
*/
typedef struct{

    char * name;
    int id;
    enum {PHYSICAL,MAGIC} schooldamage;
    int range;
    int radius;
    int cooldown;
    float curcooldown;
    int manacost;
    int needtarget;/* 1 si le sort a besoin d'une cible, 0 sinon*/
    int levelmin;
    int basedamage;


}Spell;
/** spellInit initialise un spell*/
void spellInit(Spell *);

/**
*	spellInitContinue renvoie un tableau de spell qui dependra du minlevel
*	\param nb IN-OUT :correspond au nombre de spell initialisé
*	\param level : la fonction sera appelée avec le level du hero et initialisera les spell qui sont de minlevel inferieur ou egal
*/
Spell *spellInitContinue(int *,int);

/**spellFree libère le tableau de spell*/
void spellFree(Spell *,int);

/** renvoie le cooldown du spell*/
int spellGetCooldown(const Spell *);

/** renvoie le cooldown actuel du spell*/
float spellGetCurcooldown(const Spell *);

/** renvoie le schooldamage du spell */
int spellGetSchooldamage(const Spell *);

/**renvoie le cout en mana du spell*/
int spellGetManacost(const Spell *);

/**renvoie la portée du spell */
int spellGetRange(const Spell *);

/** renvoie le rayon du spell*/
int spellGetRadius(const Spell *);

/** renvoie le booleen needtarget*/
int spellGetNeedtarget(const Spell *);

/** fonction qui reinitialise le curcooldown (on le met a la valeur "cooldown" du spell)*/
void spellSetCooldown(Spell *);

/** renvoie le basedamage du spell*/
int spellGetBasedamage(const Spell *);

/**renvoie l'Id du spell*/
int spellGetId(const Spell *);

/**
*	spellRefresh est utilisée pour decrementer le curcooldown
*	\param tabSpell : tableau de spell a refresh
*	\param num : nombre de spell
*	\param interval : valeur qui sera retranchée au curcooldown
*/
void spellRefresh(Spell *,int,float);

/** test de regression du module spell*/
void spellTestRegression();

#endif
